package com.ungs.form;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

import com.ungs.bo.IncidenteBO;
import com.ungs.bo.impl.IncidenteBOImpl;
import com.ungs.entities.Incidente;
import com.ungs.entities.SolicitudCompra;
import com.ungs.utils.Fechas;
import com.ungs.utils.ValidacionCampo;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class IncidenteForm extends JDialog {

	private static final long serialVersionUID = 1L;
	private final JPanel contentPanel = new JPanel();
	private JTextField txtSolicitudCompra;
	private JTable tbIncidente;
	private IncidenteBO incidenteBO = new IncidenteBOImpl();
	private static int COL_SOLICITUD_COMPRA = 0;
	private static int COL_FECHA_CREACION = 1;
	private static int COL_FECHA_CIERRE = 2;
	private static int COL_OBSERVACIONES = 3;
	private ArrayList<Incidente> incidentes;

	public IncidenteForm(JFrame parent) {
		super(parent, true);
		setResizable(false);
		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		this.setLocationRelativeTo(parent);
		setTitle("Incidentes");
		initForm();
		incidentes = (ArrayList<Incidente>) incidenteBO.getAllIncidente();
		cargarTablaIncidente(incidentes);
	}

	@SuppressWarnings("serial")
	private void initForm() {
		setBounds(100, 100, 666, 437);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		contentPanel.setLayout(null);

		JPanel panelBuscar = new JPanel();
		panelBuscar.setBorder(new TitledBorder(null, "Buscar",
				TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelBuscar.setBounds(24, 11, 387, 74);
		contentPanel.add(panelBuscar);
		panelBuscar.setLayout(null);

		JLabel lbSolicitudCompra = new JLabel("Solicitud de Compra");
		lbSolicitudCompra.setBounds(10, 32, 107, 14);
		panelBuscar.add(lbSolicitudCompra);

		txtSolicitudCompra = new JTextField();
		txtSolicitudCompra.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent arg0) {
				ValidacionCampo.verificarLargoCamposJTextField(arg0,
						txtSolicitudCompra, 13);
			}
		});
		txtSolicitudCompra.setBounds(113, 29, 112, 20);
		panelBuscar.add(txtSolicitudCompra);
		txtSolicitudCompra.setColumns(10);

		JButton btnBuscar = new JButton("Buscar");
		btnBuscar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				eventoBotonBuscar();
			}
		});
		btnBuscar.setBounds(254, 28, 89, 23);
		panelBuscar.add(btnBuscar);

		JPanel panelIncidente = new JPanel();
		panelIncidente.setBounds(24, 98, 601, 257);
		contentPanel.add(panelIncidente);
		panelIncidente.setLayout(null);

		JScrollPane scrollPaneIncidente = new JScrollPane();
		scrollPaneIncidente.setBounds(10, 11, 581, 235);
		panelIncidente.add(scrollPaneIncidente);

		tbIncidente = new JTable();
		tbIncidente.setModel(new DefaultTableModel(new Object[][] {},
				new String[] { "Solicitud de Compra", "Fecha Incidente",
						"Fecha de Cierre", "Observaciones" }) {
			@SuppressWarnings("rawtypes")
			Class[] columnTypes = new Class[] { String.class, String.class,
					String.class, String.class };

			@SuppressWarnings({ "unchecked", "rawtypes" })
			public Class getColumnClass(int columnIndex) {
				return columnTypes[columnIndex];
			}

			boolean[] columnEditables = new boolean[] { false, false, false,
					false };

			public boolean isCellEditable(int row, int column) {
				return columnEditables[column];
			}
		});
		tbIncidente.getColumnModel().getColumn(0).setResizable(false);
		tbIncidente.getColumnModel().getColumn(1).setResizable(false);
		tbIncidente.getColumnModel().getColumn(2).setResizable(false);
		tbIncidente.getColumnModel().getColumn(3).setResizable(false);
		scrollPaneIncidente.setViewportView(tbIncidente);
		{
			JPanel buttonPane = new JPanel();
			buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
			getContentPane().add(buttonPane, BorderLayout.SOUTH);
			{
				JButton okButton = new JButton("OK");
				okButton.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent arg0) {
						eventoOK();
					}
				});
				okButton.setActionCommand("OK");
				buttonPane.add(okButton);
				getRootPane().setDefaultButton(okButton);
			}
		}
	}

	private void cargarTablaIncidente(List<Incidente> incidenteList) {
		// Se borra la tabla
		DefaultTableModel modeloTabla = (DefaultTableModel) tbIncidente
				.getModel();
		int filas = modeloTabla.getRowCount() - 1;
		if (filas >= 0) {
			for (int i = filas; i >= 0; i--) {
				modeloTabla.removeRow(i);
			}
		}

		// Se llena la tabla
		int fila = 0;
		for (Incidente incidente : incidenteList) {
			DefaultTableModel modelo = (DefaultTableModel) tbIncidente
					.getModel();
			modelo.addRow(new Object[1]);
			tbIncidente.setValueAt(incidente.getSolicitudCompra().getCodigo(),
					fila, COL_SOLICITUD_COMPRA);
			tbIncidente.setValueAt(
					Fechas.getFechaString(incidente.getFechaIncidente()), fila,
					COL_FECHA_CREACION);
			if (incidente.getFechaCierreIncidente() != null)
				tbIncidente.setValueAt(Fechas.getFechaString(incidente
						.getFechaCierreIncidente()), fila, COL_FECHA_CIERRE);
			tbIncidente.setValueAt(incidente.getObservaciones(), fila,
					COL_OBSERVACIONES);

			fila++;
		}
	}

	private void eventoOK() {
		this.setVisible(false);
		this.dispose();
	}

	private void eventoBotonBuscar() {
		String solComp = txtSolicitudCompra.getText();
		SolicitudCompra sc = new SolicitudCompra();
		sc.setCodigo(solComp);
		incidentes = (ArrayList<Incidente>) incidenteBO
				.getAllIncidenteBySolicitudCompra(sc);
		if (incidentes.size() > 0)
			cargarTablaIncidente(incidentes);
		else {
			JOptionPane.showMessageDialog(this,
					"No existen Incidentes para el filtro.", "Mensaje",
					JOptionPane.INFORMATION_MESSAGE);
		}
	}
}
